package com.huawei.zyb.taskManager.infrastructure.persistence.mapper;

import com.huawei.zyb.taskManager.infrastructure.persistence.po.ReferenceDocumentPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 参考文档数据访问映射器
 */
@Mapper
public interface ReferenceDocumentMapper {
    
    /**
     * 插入参考文档
     */
    int insert(ReferenceDocumentPO documentPO);
    
    /**
     * 更新参考文档
     */
    int update(ReferenceDocumentPO documentPO);
    
    /**
     * 根据ID查找参考文档
     */
    ReferenceDocumentPO findById(@Param("id") Long id);
    
    /**
     * 根据文档ID查找参考文档
     */
    ReferenceDocumentPO findByDocumentId(@Param("documentId") String documentId);
    
    /**
     * 根据需求ID查找所有参考文档
     */
    List<ReferenceDocumentPO> findByRequirementId(@Param("requirementId") Long requirementId);
    
    /**
     * 根据需求ID和文档类型查找参考文档
     */
    List<ReferenceDocumentPO> findByRequirementIdAndType(
            @Param("requirementId") Long requirementId, 
            @Param("type") String type);
    
    /**
     * 根据需求ID统计参考文档数量
     */
    long countByRequirementId(@Param("requirementId") Long requirementId);
    
    /**
     * 根据需求ID和文档类型统计参考文档数量
     */
    long countByRequirementIdAndType(
            @Param("requirementId") Long requirementId, 
            @Param("type") String type);
    
    /**
     * 查找最近查看的参考文档
     */
    List<ReferenceDocumentPO> findRecentlyViewedByRequirementId(
            @Param("requirementId") Long requirementId, 
            @Param("limit") int limit);
    
    /**
     * 查找查看次数最多的参考文档
     */
    List<ReferenceDocumentPO> findMostViewedByRequirementId(
            @Param("requirementId") Long requirementId, 
            @Param("limit") int limit);
    
    /**
     * 根据ID删除参考文档
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 根据文档ID删除参考文档
     */
    int deleteByDocumentId(@Param("documentId") String documentId);
    
    /**
     * 根据需求ID删除所有参考文档
     */
    int deleteByRequirementId(@Param("requirementId") Long requirementId);
    
    /**
     * 检查参考文档是否存在
     */
    int existsByDocumentId(@Param("documentId") String documentId);
    
    /**
     * 检查需求下是否存在指定URL的文档
     */
    int existsByRequirementIdAndUrl(
            @Param("requirementId") Long requirementId, 
            @Param("url") String url);
    
    /**
     * 查找所有参考文档
     */
    List<ReferenceDocumentPO> findAll();
    
    /**
     * 更新浏览次数
     */
    int updateViewCount(@Param("documentId") String documentId);
    
    /**
     * 根据文档类型查找参考文档
     */
    List<ReferenceDocumentPO> findByType(@Param("type") String type);
    
    /**
     * 根据上传者查找参考文档
     */
    List<ReferenceDocumentPO> findByUploader(@Param("uploader") String uploader);
    
    /**
     * 查找最近的参考文档
     */
    List<ReferenceDocumentPO> findRecentDocuments(@Param("limit") int limit);
}